// 导入 Electron 模块
import { app, shell, BrowserWindow, ipcMain, Tray, nativeImage, Menu, nativeTheme } from "electron";
// 导入 path 模块中的 join 方法
import { join } from "path";
// 从 @electron-toolkit/utils 导入相关工具
import { electronApp, optimizer, is } from "@electron-toolkit/utils";
// 导入应用图标
import icon from "../../resources/icon.png?asset";

/**
 * 创建主窗口
 */
let mainWindow: any = null;
function createWindow(): void {
  // 创建浏览器窗口
  mainWindow = new BrowserWindow({
    width: 1400,
    height: 800,
    // 窗口创建后先不显示
    show: false,
    // 如果是 Linux 系统，设置窗口图标
    ...(process.platform === "linux" ? { icon } : {}),
    // 隐藏窗口边框
    frame: false,
    // https://www.electronjs.org/zh/docs/latest/api/structures/web-preferences
    webPreferences: {
      // 指定预加载脚本的路径
      preload: join(__dirname, "../preload/index.js"),
      // 禁用沙箱模式
      sandbox: false,
      // 启用实验性功能
      // experimentalFeatures: true,
    },
  });

  // 在加载页面时，渲染进程第一次完成绘制时，如果窗口还没有被显示，渲染进程会发出 ready-to-show 事件 。 在此事件后显示窗口将没有视觉闪烁
  mainWindow.on("ready-to-show", () => {
    mainWindow.show();
  });

  // 监听系统主题变化
  nativeTheme.on("updated", () => {
    const isDarkMode = nativeTheme.shouldUseDarkColors;
    mainWindow.webContents.send("system-theme-changed", isDarkMode);
  });

  // 设置窗口打开处理程序，当尝试打开新窗口时，使用系统默认浏览器打开链接
  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url);
    return { action: "deny" };
  });

  // 基于 electron-vite 命令行工具的渲染进程热更新 -- 开发环境加载远程 URL，生产环境加载本地 HTML 文件
  if (is.dev && process.env["ELECTRON_RENDERER_URL"]) {
    mainWindow.loadURL(process.env["ELECTRON_RENDERER_URL"]);
  } else {
    mainWindow.loadFile(join(__dirname, "../renderer/index.html"));
  }

  /* ******************************浏览器窗口事件监听****************************** */
  // 窗口最大化事件监听
  mainWindow.on("maximize", () => {
    // 发送消息到渲染线程
    mainWindow.webContents.send("window-maximized");
  });
  // 窗口还原事件监听
  mainWindow.on("unmaximize", () => {
    // 发送消息到渲染线程
    mainWindow.webContents.send("window-restored");
  });

  /* ******************************IPC监听****************************** */
  // 缩小窗口
  ipcMain.on("minimize-window", () => {
    mainWindow.minimize();
  });
  // 最大化窗口
  ipcMain.on("maximize-window", () => {
    mainWindow.maximize();
  });
  // 还原窗口
  ipcMain.on("restore-window", () => {
    mainWindow.restore();
  });
  // 关闭窗口
  ipcMain.on("close-window", () => {
    mainWindow.close();
  });
}

/**
 * 创建托盘栏
 */
let tray: any = null;
function createTray() {
  // 托盘图标
  const trayIcon = nativeImage.createFromPath(icon);
  // 创建托盘栏窗口
  tray = new Tray(trayIcon);

  // 上下文菜单附加到我们的托盘上
  const contextMenu = Menu.buildFromTemplate([
    {
      label: "退出",
      type: "normal",
      click: () => {
        app.quit();
      },
    },
  ]);
  tray.setContextMenu(contextMenu);

  // 托盘工具提示和标题
  tray.setToolTip("numb-tool");
  tray.setTitle("numb-tool");

  // 托盘点击事件
  tray.on("click", () => {
    // 显示主窗口
    mainWindow.show();
  });
}

// 此方法将在 Electron 完成初始化并准备好创建浏览器窗口时被调用 -- 某些 API 只能在此事件发生后使用
app.whenReady().then(() => {
  // 为 Windows 系统设置应用用户模型 ID
  electronApp.setAppUserModelId("con.numb9870");

  // 在开发环境中默认通过 F12 打开或关闭开发者工具 -- 在生产环境中忽略 CommandOrControl + R 快捷键
  app.on("browser-window-created", (_, window) => {
    optimizer.watchWindowShortcuts(window);
  });

  // 创建主窗口
  createWindow();
  // 创建托盘栏
  createTray();

  // 在 macOS 系统中，当点击 Dock 图标且没有其他窗口打开时，通常会重新创建一个窗口
  app.on("activate", function () {
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

// 当所有窗口都关闭时退出应用，macOS 系统除外 -- 在 macOS 系统中，应用及其菜单栏通常会保持活动状态，直到用户显式使用 Cmd + Q 退出
app.on("window-all-closed", () => {
  if (process.platform !== "darwin") {
    app.quit();
  }
});
